
//2841.几乎唯一子数组的最大和
class Solution {
    public:
        long long maxSum(vector<int>& nums, int m, int k) {
            int n=nums.size();
            int left=0,right=0;
            unordered_map<int,int> record;   //记录数据出现了几次
            int count=0;  //count记录不相同元素个数
            long long tmp=0,ret=0;     //此题tmp和ret需要使用long long防止越界 
            while(right<n)
            {
                //入窗口
                while(right-left<k)
                {
                    tmp+=nums[right];
                    if(record[nums[right]]==0) count++;  //还没有该元素
                    record[nums[right]]++;
    
                    right++;
                }
    
                //调整结果前还需要判断区间是否可取，即是否几乎唯一
                if(count>=m) ret=max(ret,tmp);
                
                //出窗口
                if(record[nums[left]]==1) count--;
                record[nums[left]]--;
                tmp-=nums[left++];
            }
            return ret;
        }
    };